package ar.com.gals.controller;

import java.util.Arrays;
import java.util.List;

import javax.validation.Valid;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import ar.com.gals.constants.Page;
import ar.com.gals.domain.TipoObservacion;
import ar.com.gals.domain.UnidadMedida;
import ar.com.gals.error.GalsException;
import ar.com.gals.model.BuscadorTipoObservacionModel;
import ar.com.gals.model.TipoObservacionModel;

@Controller
@RequestMapping(value = "/Edicion/Observacion")
public class TipoObservacionController extends AbstractController {

	@PreAuthorize("hasRole('EDOBSE')")
	@RequestMapping(method = RequestMethod.GET)
    public String obtenerTiposDeObservacion(Model model) {
		try 
		{
			BuscadorTipoObservacionModel tipoObservacionModel = new BuscadorTipoObservacionModel();
			List<TipoObservacion> lista = tipoObservacionModel.getTiposObservacion();
			
			model.addAttribute("unidadesMedida", UnidadMedida.values());
			model.addAttribute("tiposObservacion", lista);
			model.addAttribute("model", tipoObservacionModel);
			
			if(lista.size() == 0)
				model.addAttribute("messageResult", "No se encontraron resultados para la b&uacute;squeda solicitada");
			
	        return Page.BUSQUEDA_TIPO_OBSERVACION;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_INIT;
		}
    }
	
	
	@PreAuthorize("hasRole('EDOBSE')")
	@RequestMapping(method = RequestMethod.POST)
    public String obtenerTiposDeObservacion(
    		@ModelAttribute("model") @Valid BuscadorTipoObservacionModel tipoObservacionModel, 
    		BindingResult result, 
    		Model model) 
	{
		try 
		{
			List<TipoObservacion> lista = tipoObservacionModel.getTiposObservacion();
			
			model.addAttribute("unidadesMedida", UnidadMedida.values());
			model.addAttribute("tiposObservacion", lista);
			model.addAttribute("model", tipoObservacionModel);
		
			if(lista.size() == 0)
				model.addAttribute("messageResult", "No se encontraron resultados para la b&uacute;squeda solicitada");
			
	        return Page.BUSQUEDA_TIPO_OBSERVACION;
		}
		catch(GalsException ex) {
			model.addAttribute("unidadesMedida", UnidadMedida.values());
			model.addAttribute("tiposObservacion", Arrays.asList());
			model.addAttribute("model", tipoObservacionModel);
			model.addAttribute("errors", ex.getErrors());
			return Page.BUSQUEDA_TIPO_OBSERVACION;
		}
    }
	
	
	@PreAuthorize("hasRole('EDOBSE')")
	@RequestMapping(value = "/Alta", method = RequestMethod.GET)
    public String altaTipoObservacion(Model model) {
		model.addAttribute("unidadesMedida", UnidadMedida.values());
		model.addAttribute("model", new TipoObservacionModel());
		model.addAttribute("action", "A");
		return Page.EDICION_TIPO_OBSERVACION;
    }
	
	
	@PreAuthorize("hasRole('EDOBSE')")
	@RequestMapping(value = "/Alta", method = RequestMethod.POST)
    public String altaTipoObservacion(
    		@ModelAttribute("model") @Valid TipoObservacionModel tipoObservacionModel, 
    		BindingResult result, 
    		Model model) 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("unidadesMedida", UnidadMedida.values());
				model.addAttribute("model", tipoObservacionModel);
				model.addAttribute("action", "A");
		        return Page.EDICION_TIPO_OBSERVACION;
			}
			
			tipoObservacionModel.crearTipoObservacion();
		}
		catch(GalsException ex) {
			model.addAttribute("unidadesMedida", UnidadMedida.values());
			model.addAttribute("model", tipoObservacionModel);
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "A");
			return Page.EDICION_TIPO_OBSERVACION;
		}
		
		model.addAttribute("messageResult", "La observaci&oacute;n se creo exitosamente");
		return "redirect:" + Page.URL_OBSERVACION;
    }

	
	@PreAuthorize("hasRole('EDOBSE')")
	@RequestMapping(value = "/Modificar/{tipoObservacionId}", method = RequestMethod.GET)
    public String modificarTipoObservacion(@PathVariable("tipoObservacionId") int tipoObservacionId, Model model) {
		try 
		{
			model.addAttribute("unidadesMedida", UnidadMedida.values());
			model.addAttribute("model", new TipoObservacionModel(tipoObservacionId));
			model.addAttribute("action", "M");
	        return Page.EDICION_TIPO_OBSERVACION;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_OBSERVACION;
		}
    }
	
	
	@PreAuthorize("hasRole('EDOBSE')")
	@RequestMapping(value = "/Modificar/{tipoObservacionId}", method = RequestMethod.POST)
    public String modificarTipoObservacion(
    		@PathVariable("tipoObservacionId") int tipoObservacionId,
    		@ModelAttribute("model") @Valid TipoObservacionModel tipoObservacionModel, 
    		BindingResult result, 
    		Model model) 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("unidadesMedida", UnidadMedida.values());
				model.addAttribute("model", tipoObservacionModel);
				model.addAttribute("action", "M");
				return Page.EDICION_TIPO_OBSERVACION;
			}
			
			tipoObservacionModel.modificarTipoObservacion(tipoObservacionId);
		}
		catch(GalsException ex) {
			model.addAttribute("unidadesMedida", UnidadMedida.values());
			model.addAttribute("model", tipoObservacionModel);
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "M");
			return Page.EDICION_TIPO_OBSERVACION;
		}

		model.addAttribute("messageResult", "La observaci&oacute;n se modific&oacute; exitosamente");
		return "redirect:" + Page.URL_OBSERVACION;
    }
	

	@PreAuthorize("hasRole('EDOBSE')")
	@RequestMapping(value = "/Eliminar/{tipoObservacionId}", method = RequestMethod.GET)
    public String eliminarTipoObservacion(@PathVariable("tipoObservacionId") int tipoObservacionId, Model model) {
		try 
		{
			model.addAttribute("unidadesMedida", UnidadMedida.values());
			model.addAttribute("model", new TipoObservacionModel(tipoObservacionId));
			model.addAttribute("action", "B");
	        return Page.EDICION_TIPO_OBSERVACION;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_OBSERVACION;
		}
    }
	
	
	@PreAuthorize("hasRole('EDOBSE')")
	@RequestMapping(value = "/Eliminar/{tipoObservacionId}", method = RequestMethod.POST)
    public String eliminarTipoObservacion(
    		@PathVariable("tipoObservacionId") int tipoObservacionId,
    		@ModelAttribute("model") @Valid TipoObservacionModel tipoObservacionModel, 
    		BindingResult result, 
    		Model model) 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("unidadesMedida", UnidadMedida.values());
				model.addAttribute("model", tipoObservacionModel);
				model.addAttribute("action", "B");
				return Page.EDICION_TIPO_OBSERVACION;
			}
			
			tipoObservacionModel.eliminarTipoObservacion(tipoObservacionId);
		}
		catch(GalsException ex) {
			model.addAttribute("unidadesMedida", UnidadMedida.values());
			model.addAttribute("model", tipoObservacionModel);
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "B");
			return Page.EDICION_TIPO_OBSERVACION;
		}
		
		model.addAttribute("messageResult", "La observaci&oacute;n se elimin&oacute; exitosamente");
		return "redirect:" + Page.URL_OBSERVACION;
    }
}
 